/**
 * 文件名：@ConverterValidatorAdapter.java <br/>
 * 包名：cn.efunbox.afw.core.regulation <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.regulation;

import cn.efunbox.afw.core.converter.Converter;
import cn.efunbox.afw.core.exception.SystemException;
import cn.efunbox.afw.core.mvc.context.Context;
import cn.efunbox.afw.core.resolver.Resolver;
import cn.efunbox.afw.core.validation.Validator;

/**
 * 类名：ConverterValidatorAdapter  <br />
 *
 * 功能：类型转换校验适配器
 *
 * @author xtwin <br />
 * 创建时间：2015年12月2日 下午3:47:33  <br />
 * @version 2015年12月2日
 */
public class ConverterValidatorAdapter implements Validator {
	
	// 类型转换对象解析器
	protected Resolver<Converter> converterResolver;

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月2日 下午3:47:48<br/>
	 * 
	 * @param field
	 * @param value
	 * @param message
	 * @param config
	 * @return
	 * @throws Exception <br/>
	 * @see cn.efunbox.afw.core.validation.Validator#validate(cn.efunbox.afw.core.mvc.context.Context, java.lang.String, java.lang.Object, java.lang.String, java.lang.Object)
	 */
	@Override
	public Object validate(Context context, String field, Object value, String message, Object config) throws Exception {
		String _config = (String) config;
		
		int index = _config.indexOf(':');
		
		String _name = _config;
		
		if (index != -1) {
			_name = _config.substring(0, index);
			_config = _config.substring(index + 1);
		}
		
		//String[] cfs = ((String) config).split("\\:");
		
		// 解析出类型转换器
		Converter converter = resolveTypeConverter(_name);
		
		if (null == converter) {
			throw new SystemException("converter.resolve.result.is.null", new Object[] { _name });
		}
		
		// 交给转换器执行转换处理
		return converter.convert(value, _config);
	}
	
	/**
	 * 
	 * 功能：解析出类型转换器对象 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月2日 下午3:56:38 <br/>
	 */
	protected Converter resolveTypeConverter(String name) throws Exception {
		return converterResolver.resolve(name);
	}

	/**
	 * @version 2015年12月2日-下午3:57:09
	 */
	public void setConverterResolver(Resolver<Converter> converterResolver) {
		this.converterResolver = converterResolver;
	}
}
